// Task 处理异步任务
const { task } = require('folktale/concurrency/task');
const fs = require('fs');
const fp = require('lodash/fp');

function readFile(filename) {
  return task(resolver => { 
    fs.readFile(filename, 'utf-8', (err, data) => {
      if (err) { resolver.reject(err); }
      resolver.resolve(data);
    })
  });
}

let a = readFile('package.json') // 执行readFile后 返回了一个Task函子
  .map(fp.flow(fp.split('\n'), fp.find(x => x.includes('version'))))
  .run()
  .listen({
    onRejected: err => { console.log(err); },
    onResolved: data => { console.log(data); }
  })
console.log(a);

// 步骤分析
// 1. 先执行readFile返回一个Task函子 函子中的_val = 
//    read = resolver => {
//      fs.readFile(filename, 'utf-8', (err, data) => {
//        if (err) { resolver.reject(err); }
//        resolver.resolve(data);
//      })
//    }
// 2. .map执行 返回一个新Task函子 
//     函子中的_val = fp.flow(read, fp.split('\n'), fp.find(x => x.includes('version')))
// 3. run执行 执行上面的函数组合 读取文件 注意 此时的Task函子中的_val 已经是组合函数了
//    在函子执行函数的时候 因为用了组合函数 所以一定会等前一个函数执行完并返回值才会进行下一个函数的执行
//    所以 read 这个异步函数 执行完 活的到json的内容 再交给后续的函数处理